package com.collabscm.pf.profiler;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import com.collabscm.pf.logging.Logger;
import com.collabscm.pf.logging.LoggerFactory;

/**
 * 系统分析工具，主要监控系统运行时的各种参数
 *
 * @author Zeng Raoxing
 */
//@Aspect
public class Profiler {
	private static final Logger logger = LoggerFactory.getLogger(Profiler.class);
	/**
	 * 默认的上限时间为1秒
	 */
	public static final int defaultUptime = 1000;
	
//	@Pointcut("@annotation(com.collabscm.pf.profiler.Monitor)")
//	public void monitorMethod() {
//		System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@22");
//	}
	
//	@Around("monitorMethod()")
	public Object tuneMethod(ProceedingJoinPoint pjp/*, Monitor m*/) throws Throwable {
		MethodSignature method = (MethodSignature) pjp.getSignature();
		Monitor mon = method.getMethod().getAnnotation(Monitor.class);
		long startTime = System.currentTimeMillis();
		try {
			//直接返回操作结果
			return pjp.proceed();
		} finally {
			if(mon != null) {
				long endTime = System.currentTimeMillis();
				int uptime = mon.uptime() > 0 ? mon.uptime() : defaultUptime;
				//TODO 添加于slf4j的集成，将debug、info级别等信息都统统打出来。
				if(endTime - startTime > uptime) {//表示需要监控调用上限
					logger.warn("{}处理时间为{}ms，超过系统设置的{}ms。", method, (endTime - startTime), uptime);
				} else {
					logger.debug("{}处理时间为{}ms，系统设置的{}ms，符合要求。", method, (endTime - startTime), uptime);
				}
			} else {
				logger.error("未得到{}定义的@Monitor。", method);
			}
		}
	}
	
}
